package com.dao;

import com.entity.Goods;
import com.entity.GoodsBasic;

import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface GoodsDao {

    /**
     * 书籍被删除状态
     */
    int DELETE = -1;

    /**
     * 书籍正常下架状态
     */
    int NORMAL_OFF_SHELVE = 0;

    /**
     * 在卖状态
     */
    int ON_SHELVE = 1;

    /**
     * 商品不合格下架
     */
    int UNQUALIFIED_OFF_SHELVE = 2;

    /**
     * 卖家多次违规下架
     */
    int SELLER_UNQUALIFIED_OFF_SHELVE = 3;

    String[] ORDER_BY = {"product_price", "product_price", "product_grade"};

    List<Goods> selectGoods(
            @Param("start") int start,
            @Param("num") int num,
            @Param("goodId") String goodId,
            @Param("status") int status,
            @Param("fromPrice") Float fromPrice,
            @Param("toPrice") Float toPrice,
            @Param("categoryId") Integer categoryId,
            @Param("name") String name,
            @Param("userId") String userId,
            @Param("fromUpdateTime") Date fromUpdateTime,
            @Param("toUpdateTime") Date toUpdateTime,
            @Param("fromPublicDate") Date fromPublicDate,
            @Param("toPublicDate") Date toPublicDate,
            @Param("author") String author,
            @Param("appearance") String appearance,
            @Param("pressHorse") String pressHorse,
            @Param("sortWay") String sortWay);

    /**
     * 流水灯商品
     *
     * @param count 数量
     * @return
     */
    List<Map<String, String>> getMostPopular(@Param("count") int count);

    // 获取商品的完整信息
    Goods selectGoodById(@Param("goodId") String goodId, @Param("minStatus") int minStatus);

    int updateViewCount(@Param("userId") String userId, @Param("goodId") String goodId);

    GoodsBasic selectGoodBasicById(@Param("goodId") String goodId, @Param("minStatus") int minStatus);

    List<GoodsBasic> selectCategoryPopularGoodsBasic(
            @Param("categoryId") int categoryId, @Param("count") int count);

    String selectGoodImageURL(String goodId);

    String selectSellerId(@Param("goodId") String goodId);

    Map<String, String> selectSeller(@Param("goodId") String goodId);

    List<GoodsBasic> searchGoods(
            @Param("keyWords") String keywords,
            @Param("sortBy") String sortBy,
            @Param("sortWay") String sortWay,
            @Param("startIndex") int startIndex,
            @Param("num") int num);

    List<GoodsBasic> selectRelevantGoods(@Param("goodId") String goodId);

    /**
     * 获取该书籍作者其他作品
     */
    List<GoodsBasic> selectAuthorGoods(@Param("goodId") String goodId);

    List<GoodsBasic> selectAlsoViewGoods(
            @Param("goodId") String goodId, @Param("count") int count, @Param("userId") String userId);

    List<Map<String, Object>> selectRelevantCategories(@Param("goodId") String goodId);

    void insertGood(
            @Param("userId") String userId,
            @Param("goodId") String goodId,
            @Param("name") String name,
            @Param("imageURL") String imageURL,
            @Param("price") float price,
            @Param("appearance") String appearance,
            @Param("ISBN") String ISBN,
            @Param("categoryId") int categoryId,
            @Param("author") String author,
            @Param("translator") String translator,
            @Param("version") String version,
            @Param("store") int store,
            @Param("freight") float freight,
            @Param("pressHorse") String pressHorse,
            @Param("publicationDate") Date publicationDate,
            @Param("describe") String describe,
            @Param("status") int status);

    int updateGoodInfo(
            @Param("userId") String userId,
            @Param("goodId") String goodId,
            @Param("name") String name,
            @Param("price") float price,
            @Param("appearance") String appearance,
            @Param("ISBN") String ISBN,
            @Param("categoryId") int categoryId,
            @Param("author") String author,
            @Param("translator") String translator,
            @Param("version") String version,
            @Param("store") int store,
            @Param("freight") float freight,
            @Param("pressHorse") String pressHorse,
            @Param("publicationDate") Date publicationDate,
            @Param("describe") String describe);

    int updateGoodStatus(
            @Param("userId") String userId,
            @Param("goodId") String goodId,
            @Param("newStatus") int newStatus);

    /**
     * 更接一个卖家的所有商品的状态（除已删除）
     *
     * @param userId    卖家编号
     * @param newStatus 新的状态
     * @return 更新的条数
     */
    int updateUserAllGoodsStatus(@Param("userId") String userId, @Param("newStatus") int newStatus);

    int updateGoodImageURL(
            @Param("userId") String userId,
            @Param("goodId") String goodId,
            @Param("imageURL") String imageURL);

    int selectSellerGoodCount(@Param("userId") String userId, @Param("status") int status);

    List<Goods> selectSellerGoods(
            @Param("userId") String userId,
            @Param("goodsStatus") int goodsStatus,
            @Param("startIndex") int startIndex,
            @Param("num") int num);

    int selectGoodMoreFileCount(@Param("goodId") String goodId);

    List<String> selectGoodMoreFiles(@Param("goodId") String goodId);

    // 商品更多图片的处理
    int insertMoreFilesURL(@Param("goodId") String goodId, @Param("filesURL") List<String> filesURL);

    int deleteMoreFileURL(@Param("goodId") String goodId, @Param("fileURL") String fileURL);

    int deleteAllMoreFileURL(@Param("goodId") String goodId);

    List<Goods> selectAllGoods(@Param("startIndex") int startIndex, @Param("num") int num);

    /**
     * 获取所有商品数量（不包括已删除的 即状态为-1的）
     *
     * @return 所有商品数量
     */
    int selectAllGoodCount();

    List<Map<String, Object>> selectTypeGoodCount();

    int selectGoodType(@Param("goodId") String goodId);

    List<Goods> selectGoodsByCategoryList(
            @Param("categoryList") List<Integer> categoryList, @Param("goodsNum") int goodsNum);
}
